Typical HAL DAC use cases for migration ¶
This section provides information about typical HAL DAC architecture use cases for migration.
Use case: DAC using software trigger mode ¶
This use case demonstrates how to configure and start the DAC channel using the software trigger.
Sequence diagram ¶
Code snippet ¶
|
HAL1 |
HAL2 |
|---|---|
DAC_ChannelConfTypeDef sConfig;
HAL_DAC_Init(&hdac1);
sConfig.DAC_HighFrequency = DAC_HIGH_FREQUENCY_INTERFACE_MODE_ABOVE_80MH;
sConfig.DAC_DMADoubleDataMode = DISABLE;
sConfig.DAC_SignedFormat = DISABLE;
sConfig.DAC_SampleAndHold = DAC_SAMPLEANDHOLD_DISABLE;
sConfig.DAC_Trigger = DAC_TRIGGER_SOFTWARE;
sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;
sConfig.DAC_ConnectOnChipPeripheral = DAC_CHIPCONNECT_EXTERNAL;
sConfig.DAC_UserTrimming = DAC_TRIMMING_FACTORY;
sConfig.DAC_TrimmingValue = 31;
HAL_DAC_ConfigChannel(&hdac1, &sConfig, DAC_CHANNEL_1);
/* The calibration of DAC is Optional */
HAL_DACEx_SelfCalibrate(&hdac1, &sConfig, DAC_CHANNEL_1);
HAL_DACEx_SetUserTrimming(&hdac1, &sConfig, DAC_CHANNEL_1, 31);
HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1,
DAC_ALIGN_12B_R, 2048);
HAL_DAC_Start(&hdac, DAC_CHANNEL_1);
HAL_DAC_Stop(&hdac, DAC_CHANNEL_1);
|
hal_dac_config_t p_config;
hal_dac_channel_config_t p_config1;
HAL_DAC_Init(&hdac, HAL_DAC1);
p_config.high_frequency_mode = HAL_DAC_HIGH_FREQ_MODE_ABOVE_80MHZ;
HAL_DAC_SetConfig(&hdac, &p_config);
p_config1.data_sign_format = HAL_DAC_SIGN_FORMAT_UNSIGNED;
p_config1.data_trigger = HAL_DAC_TRIGGER_SOFTWARE;
p_config1.output_buffer = HAL_DAC_OUTPUT_BUFFER_ENABLED;
p_config1.output_connection = HAL_DAC_OUTPUT_CONNECTION_EXTERNAL;
p_config1.alignment = HAL_DAC_DATA_ALIGN_12_BITS_RIGHT;
HAL_DAC_SetConfigChannel(&hdac, HAL_DAC_CHANNEL_1, &p_config1);
/* The calibration of DAC is Optional */
HAL_DAC_CalibrateChannelBuffer(&hdac, HAL_DAC_CHANNEL_1);
HAL_DAC_SetChannelBufferCalibrationValue(&hdac, HAL_DAC_CHANNEL_1, 31);
HAL_DAC_SetChannelAlignment(&hdac, HAL_DAC_CHANNEL_1,
HAL_DAC_DATA_ALIGN_12_BITS_RIGHT);
HAL_DAC_SetChannelData(&hdac, HAL_DAC_CHANNEL_1,
2048);
HAL_DAC_StartChannel(&hdac, HAL_DAC_CHANNEL_1);
HAL_DAC_TrigSWConversionChannel(&hdac, HAL_DAC_CHANNEL_1);
HAL_DAC_StopChannel(&hdac, HAL_DAC_CHANNEL_1);
|
Key changes ¶
In HAL2, the DAC global configuration is set using
HAL_DAC_SetConfig().In HAL2, channel configuration and data setting use channel-based APIs (
HAL_DAC_SetConfigChannel(),HAL_DAC_SetChannelData(), andHAL_DAC_StartChannel()).In HAL2, a software-triggered conversion is explicitly started using
HAL_DAC_TrigSWConversionChannel().
Use case: DAC using timer trigger or external trigger ¶
This use case demonstrates how to configure the DAC channel to convert data using a timer trigger or an external trigger.
Sequence diagram ¶
Code snippet ¶
|
HAL1 |
HAL2 |
|---|---|
HAL_DAC_Init(&hdac1);
DAC_ChannelConfTypeDef sConfig;
sConfig.DAC_HighFrequency = DAC_HIGH_FREQUENCY_INTERFACE_MODE_ABOVE_80MH;
sConfig.DAC_DMADoubleDataMode = DISABLE;
sConfig.DAC_SignedFormat = DISABLE;
sConfig.DAC_SampleAndHold = DAC_SAMPLEANDHOLD_DISABLE;
sConfig.DAC_Trigger = DAC_TRIGGER_T1_TRGO;
sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;
sConfig.DAC_ConnectOnChipPeripheral = DAC_CHIPCONNECT_EXTERNAL;
sConfig.DAC_UserTrimming = DAC_TRIMMING_FACTORY;
sConfig.DAC_TrimmingValue = 31;
HAL_DAC_ConfigChannel(&hdac1, &sConfig, DAC_CHANNEL_1);
/* The calibration of DAC is Optional */
HAL_DACEx_SelfCalibrate(&hdac1, &sConfig, DAC_CHANNEL_1);
HAL_DACEx_SetUserTrimming(&hdac1, &sConfig, DAC_CHANNEL_1, 31);
HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1,
DAC_ALIGN_12B_R, 2048);
HAL_DAC_Start(&hdac, DAC_CHANNEL_1);
HAL_DAC_Stop(&hdac, DAC_CHANNEL_1);
|
hal_dac_config_t p_config;
hal_dac_channel_config_t p_config1;
HAL_DAC_Init(&hdac, HAL_DAC1);
p_config.high_frequency_mode = HAL_DAC_HIGH_FREQ_MODE_ABOVE_80MHZ;
HAL_DAC_SetConfig(&hdac, &p_config);
p_config1.data_sign_format = HAL_DAC_SIGN_FORMAT_UNSIGNED;
p_config1.data_trigger = HAL_DAC_TRIGGER_TIM1_TRGO;
p_config1.output_buffer = HAL_DAC_OUTPUT_BUFFER_ENABLED;
p_config1.output_connection = HAL_DAC_OUTPUT_CONNECTION_EXTERNAL;
p_config1.alignment = HAL_DAC_DATA_ALIGN_12_BITS_RIGHT;
HAL_DAC_SetConfigChannel(&hdac, HAL_DAC_CHANNEL_1,
&p_config1);
/* The calibration of DAC is Optional */
HAL_DAC_CalibrateChannelBuffer(&hdac, HAL_DAC_CHANNEL_1);
HAL_DAC_SetChannelBufferCalibrationValue(&hdac, HAL_DAC_CHANNEL_1, 31);
HAL_DAC_SetChannelAlignment(&hdac, HAL_DAC_CHANNEL_1,
HAL_DAC_DATA_ALIGN_12_BITS_RIGHT);
HAL_DAC_SetChannelData(&hdac, HAL_DAC_CHANNEL_1,
2048);
HAL_DAC_StartChannel(&hdac, HAL_DAC_CHANNEL_1);
HAL_DAC_StopChannel(&hdac, HAL_DAC_CHANNEL_1);
|
Key changes ¶
In HAL2, the channel trigger source is configured via the channel configuration structure.
In HAL2, the DAC start/stop operations are performed per channel using
HAL_DAC_StartChannel()andHAL_DAC_StopChannel().
Related examples in HAL2 ¶
|
Example name |
Brief |
|---|---|
|
hal_dac_waveform_triangle_tim |
How to use the DAC HAL API to generate a triangle waveform with internal generation and a timer trigger. |
Use case: Single channel DAC transfer using DMA ¶
This use case demonstrates how to transfer samples to a DAC channel using DMA.
Sequence diagram ¶
Code snippet ¶
|
HAL1 |
HAL2 |
|---|---|
uint32_t aEscalator12bit[6] = {0x0, 0x330, 0x660, 0x990, 0xCC0, 0xFF0};
DAC_ChannelConfTypeDef sConfig;
sConfig.DAC_HighFrequency = DAC_HIGH_FREQUENCY_INTERFACE_MODE_ABOVE_80MH;
sConfig.DAC_DMADoubleDataMode = DISABLE;
sConfig.DAC_SignedFormat = DISABLE;
sConfig.DAC_SampleAndHold = DAC_SAMPLEANDHOLD_DISABLE;
sConfig.DAC_Trigger = DAC_TRIGGER_SOFTWARE;
sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;
sConfig.DAC_ConnectOnChipPeripheral = DAC_CHIPCONNECT_EXTERNAL;
sConfig.DAC_UserTrimming = DAC_TRIMMING_FACTORY;
sConfig.DAC_TrimmingValue = 31;
HAL_DAC_ConfigChannel(&hdac1, &sConfig, DAC_CHANNEL_1);
HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 2048);
HAL_DAC_Start_DMA(&hdac1, DAC_CHANNEL_1, aEscalator12bit, 6, DAC_ALIGN_12B_R);
HAL_DAC_Stop_DMA(&hdac1, DAC_CHANNEL_1);
|
uint32_t aEscalator12bit[6] = {0x0, 0x330, 0x660, 0x990, 0xCC0, 0xFF0};
hal_dac_config_t p_config;
hal_dac_channel_config_t p_config1;
p_config.high_frequency_mode = HAL_DAC_HIGH_FREQ_MODE_ABOVE_80MHZ;
HAL_DAC_SetConfig(&hdac, &p_config);
p_config1.data_sign_format = HAL_DAC_SIGN_FORMAT_UNSIGNED;
p_config1.data_trigger = HAL_DAC_TRIGGER_TIM1_TRGO;
p_config1.output_buffer = HAL_DAC_OUTPUT_BUFFER_ENABLED;
p_config1.output_connection = HAL_DAC_OUTPUT_CONNECTION_EXTERNAL;
p_config1.alignment = HAL_DAC_DATA_ALIGN_12_BITS_RIGHT;
HAL_DAC_SetConfigChannel(&hdac, HAL_DAC_CHANNEL_1,
&p_config1);
HAL_DAC_SetChannelAlignment(&hdac, HAL_DAC_CHANNEL_1,
HAL_DAC_DATA_ALIGN_12_BITS_RIGHT);
HAL_DAC_SetChannelData(&hdac, HAL_DAC_CHANNEL_1,
2048);
HAL_DAC_StartChannel_DMA(&hdac, HAL_DAC_CHANNEL_1, aEscalator12bit, 6);
HAL_DAC_StopChannel_DMA(&hdac, HAL_DAC_CHANNEL_1);
|
Key changes ¶
In HAL2, channel configuration and data setting are performed using channel-based APIs.
In HAL2, DMA transfer start/stop operations are performed per channel using
HAL_DAC_StartChannel_DMA()andHAL_DAC_StopChannel_DMA().
Related examples in HAL2 ¶
|
Example name |
Brief |
|---|---|
|
hal_dac_signal_generation_dma_tim |
How to use the DAC HAL API to generate a sinusoidal signal using DMA with a timer trigger. |
Use case: Dual channel DAC transfer using DMA ¶
This use case demonstrates how to transfer samples to two DAC channels using DMA.
Sequence diagram ¶
Code snippet ¶
|
HAL1 |
HAL2 |
|---|---|
uint32_t aEscalator12bit[6] = {0x0, 0x330, 0x660, 0x990, 0xCC0, 0xFF0};
DAC_ChannelConfTypeDef sConfig;
sConfig.DAC_HighFrequency = DAC_HIGH_FREQUENCY_INTERFACE_MODE_ABOVE_80MH;
sConfig.DAC_DMADoubleDataMode = DISABLE;
sConfig.DAC_SignedFormat = DISABLE;
sConfig.DAC_SampleAndHold = DAC_SAMPLEANDHOLD_DISABLE;
sConfig.DAC_Trigger = DAC_TRIGGER_T1_TRGO;
sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;
sConfig.DAC_ConnectOnChipPeripheral = DAC_CHIPCONNECT_EXTERNAL;
sConfig.DAC_UserTrimming = DAC_TRIMMING_FACTORY;
sConfig.DAC_TrimmingValue = 31;
HAL_DAC_ConfigChannel(&hdac1, &sConfig, DAC_CHANNEL_1);
HAL_DAC_ConfigChannel(&hdac1, &sConfig, DAC_CHANNEL_2);
HAL_DACEx_DualSetValue(&hdac1, DAC_ALIGN_12B_R, 0x0FFF, 0x07FF);
HAL_DACEx_DualStart_DMA(&hdac1, DAC_CHANNEL_1, aEscalator12bit, 6, DAC_ALIGN_12B_R);
HAL_DACEx_DualStop_DMA(&hdac1, DAC_CHANNEL_1);
|
uint32_t aEscalator12bit[6] = {0x0, 0x330, 0x660, 0x990, 0xCC0, 0xFF0};
hal_dac_dual_channel_config_t dacDualChannelConfig;
hal_dac_config_t p_config;
p_config.high_frequency_mode = HAL_DAC_HIGH_FREQ_MODE_ABOVE_80MHZ;
HAL_DAC_SetConfig(&hdac, &p_config);
dacDualChannelConfig.channel1_config_t.data_sign_format = HAL_DAC_SIGN_FORMAT_UNSIGNED;
dacDualChannelConfig.channel1_config_t.trigger = HAL_DAC_TRIGGER_TIM1_TRGO;
dacDualChannelConfig.channel1_config_t.output_buffer = HAL_DAC_OUTPUT_BUFFER_ENABLED;
dacDualChannelConfig.channel1_config_t.output_connection = HAL_DAC_OUTPUT_CONNECTION_EXTERNAL;
/* Config Channel 2 */
dacDualChannelConfig.channel2_config_t.data_sign_format = HAL_DAC_SIGN_FORMAT_UNSIGNED;
dacDualChannelConfig.channel2_config_t.trigger = HAL_DAC_TRIGGER_TIM1_TRGO;
dacDualChannelConfig.channel2_config_t.output_buffer = HAL_DAC_OUTPUT_BUFFER_ENABLED;
dacDualChannelConfig.channel2_config_t.output_connection = HAL_DAC_OUTPUT_CONNECTION_EXTERNAL;
dacDualChannelConfig.alignment = HAL_DAC_DATA_ALIGN_12_BITS_RIGHT;
HAL_DAC_SetConfigDualChannel(&hdac, &dacDualChannelConfig);
HAL_DAC_SetDualChannelData(&hdac, 0x0FFF);
HAL_DAC_StartDualChannel_DMA(&hdac, aEscalator12bit, 6);
HAL_DAC_StopDualChannel_DMA(&hdac);
|
Key changes ¶
In HAL2, dual-channel configuration uses a dedicated configuration structure and API (
HAL_DAC_SetConfigDualChannel()).In HAL2, the DMA transfer is started/stopped with dual-channel specific APIs (
HAL_DAC_StartDualChannel_DMA()andHAL_DAC_StopDualChannel_DMA()).
Related examples in HAL2 ¶
|
Example name |
Brief |
|---|---|
|
hal_dac_dual_signal_generation_dma_tim |
How to use the DAC HAL API to generate a dual data conversion using DMA with a timer trigger. |
![@startuml
participant "Application" as App
participant "DAC" as DAC
App -> DAC: HAL_DAC_Init()
App -> DAC: HAL_DAC_ConfigChannel()
group Optional [The calibration of DAC is Optional]
App -> DAC: HAL_DACEx_SelfCalibrate()
App -> DAC: HAL_DACEx_SetUserTrimming()
end
App -> DAC: HAL_DAC_SetValue()
App -> DAC: HAL_DAC_Start()
App -> DAC: HAL_DAC_Stop()
@enduml](../../../../../_images/plantuml-9e9dc42641b23aee54102d1a323eddfa89682861.png)
![@startuml
participant "Application" as App
participant "DAC" as DAC
App -> DAC: HAL_DAC_Init()
App -> DAC: HAL_DAC_SetConfig()
App -> DAC: HAL_DAC_SetConfigChannel()
note right : <font color=blue> setting software trigger
group Optional [The calibration of DAC is Optional]
App -> DAC: HAL_DAC_CalibrateChannelBuffer()
App -> DAC: HAL_DAC_SetChannelBufferCalibrationValue()
end
App -> DAC: HAL_DAC_SetChannelAlignment()
App -> DAC: HAL_DAC_SetChannelData()
App -> DAC: HAL_DAC_StartChannel()
App -> DAC: HAL_DAC_TrigSWConversionChannel()
note right : <font color=blue> trig conversion using this software trigger
App -> DAC: HAL_DAC_StopChannel()
@enduml](../../../../../_images/plantuml-0a9510af5d8caf9ae5a3341c192499555c92f699.png)
![@startuml
participant "Application" as App
participant "DAC" as DAC
App -> DAC: HAL_DAC_Init()
App -> DAC: HAL_DAC_SetConfig()
App -> DAC: HAL_DAC_SetConfigChannel()
note right: <font color=blue> set data format, set output mode, set external or timer trigger
group Optional [The calibration of DAC is Optional]
App -> DAC: HAL_DAC_CalibrateChannelBuffer()
App -> DAC: HAL_DAC_SetChannelBufferCalibrationValue()
end
App -> DAC: HAL_DAC_SetChannelAlignment()
App -> DAC: HAL_DAC_SetChannelData()
note right: <font color=blue> DAC is using timer trigger or external trigger to convert
App -> DAC: HAL_DAC_StartChannel()
App -> DAC: HAL_DAC_StopChannel()
@enduml](../../../../../_images/plantuml-8b7a858a1ba1d5dbf7a01833a87adde89fd53e97.png)



